using System;
using System.Collections.Generic;
using NHibernate.Criterion;
using EntitiesAndMappings.Entities;
using NHibernate.SqlCommand;
using ProyectoSelva.Const;
using ProyectoSelva.Dtos;

namespace ProyectoSelva.Daos
{
    public class ContratoDAO : BaseDAO<Contrato>
    {

        public IList<Contrato> ObtenerActivos()
        {
            IList<Contrato> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Contrato>();
                    criteria.Add(Restrictions.Eq("Estado", "A"));
                    lista = criteria.List<Contrato>();
                    transaction.Commit();
                }

            }
            return lista;
        }

        public Contrato Actualizar(Contrato contrato)
        {
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    session.SaveOrUpdate(contrato);
                    transaction.Commit();
                }
            }
            return contrato;
        }


        public IList<Contrato> Buscar(Contrato contrato)
        {
            IList<Contrato> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Contrato>();
                    if (contrato.Trabajador != null)
                    {
                        criteria.CreateAlias("Trabajador", "Trabajador", JoinType.InnerJoin);                    
                        if (contrato.Trabajador.Nombres != null)
                        {
                            criteria.Add(Restrictions.Like("Trabajador.Nombre", contrato.Trabajador.Nombres+"%"));
                        }
                        if (contrato.Trabajador.Apellidos != null)
                        {
                            criteria.Add(Restrictions.Like("Trabajador.Apellidos", contrato.Trabajador.Apellidos + "%"));
                        }
                        if (contrato.Trabajador.NumeroDocumento != null)
                        {
                            criteria.Add(Restrictions.Like("Trabajador.NumeroDocumento", contrato.Trabajador.NumeroDocumento + "%"));
                        }
                    }
                    if (contrato.Proyecto != null)
                    {
                        criteria.CreateAlias("Proyecto", "Proyecto", JoinType.InnerJoin);
                        if (string.IsNullOrEmpty(contrato.Proyecto.Codigo))
                        {
                            criteria.Add(Restrictions.Eq("Proyecto.Id", contrato.Proyecto.Id));
                        }
                    }
                    criteria.Add(Restrictions.Eq("Estado", "A"));
                    lista = criteria.List<Contrato>();
                    transaction.Commit();
                }

            }
            return lista;
        }

        public bool EsValido(Contrato contrato)
        {
            bool valido;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Contrato>();
                    //TODO Verificar esta restriccion
                    criteria.Add(Restrictions.Or(Restrictions.Lt("FechaTerminoContrato", contrato.FechaTerminoContrato),
                                                 Restrictions.Le("FechaTerminoContrato", contrato.FechaInicioContrato)));
                    if (contrato.Id != 0 )
                    {
                        criteria.Add(Restrictions.Not(Restrictions.Eq("Id",contrato.Id)));
                    }
                    criteria.Add(Restrictions.Eq("Trabajador.Id",contrato.Trabajador.Id));
                    criteria.Add(Restrictions.Eq("Estado", "A"));
                    var lista = criteria.List();
                    transaction.Commit();
                    valido = (lista.Count == 0);
                }
            }
            return valido;
        }

        public IList<Contrato> BuscarPorRangoFechaFin(DateTime fechaInicio, DateTime fechaFin)
        {
            IList<Contrato> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Contrato>();
                    criteria.Add(Restrictions.Between("FechaTerminoContrato", fechaInicio, fechaFin));
                    criteria.Add(Restrictions.Eq("Estado", "A"));
                    lista = criteria.List<Contrato>();
                    transaction.Commit();
                }

            }
            return lista;
        }

        public IList<Contrato> Buscar(ConsultaContratoDTO consultaContratoDTO)
        {
            IList<Contrato> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Contrato>();
                    criteria.CreateAlias("Trabajador", "Trabajador", JoinType.InnerJoin);
                    if (!string.IsNullOrEmpty(consultaContratoDTO.Nombres))
                    {
                        criteria.Add(Restrictions.Like("Trabajador.Nombres", consultaContratoDTO.Nombres + "%"));
                    }
                    if (!string.IsNullOrEmpty(consultaContratoDTO.Apellidos))
                    {
                        criteria.Add(Restrictions.Like("Trabajador.Apellidos", consultaContratoDTO.Apellidos + "%"));
                    }
                    if (consultaContratoDTO.Empresa != null && !string.IsNullOrEmpty(consultaContratoDTO.Empresa.Codigo))
                    {
                        criteria.CreateAlias("Empresa", "Empresa", JoinType.InnerJoin);
                        criteria.Add(Restrictions.Eq("Empresa.Id", consultaContratoDTO.Empresa.Id));
                    }
                    if (consultaContratoDTO.Proyecto != null && !string.IsNullOrEmpty(consultaContratoDTO.Proyecto.Codigo))
                    {
                        criteria.CreateAlias("Proyecto", "Proyecto", JoinType.InnerJoin);
                        criteria.Add(Restrictions.Eq("Proyecto.Id", consultaContratoDTO.Proyecto.Id));
                    }
                    if (consultaContratoDTO.Lote != null && !string.IsNullOrEmpty(consultaContratoDTO.Lote.Codigo))
                    {
                        criteria.CreateAlias("Lote", "Lote", JoinType.InnerJoin);
                        criteria.Add(Restrictions.Eq("Lote.Id", consultaContratoDTO.Lote.Id));
                    }
                    if (consultaContratoDTO.FiltraInicioContrato)
                    {
                        criteria.Add(Restrictions.Between("FechaInicioContrato", consultaContratoDTO.FechaInicioContratoDesde, consultaContratoDTO.FechaInicioContratoHasta));
                    }
                    if (consultaContratoDTO.FiltraTerminoContrato)
                    {
                        criteria.Add(Restrictions.Between("FechaTerminoContrato", consultaContratoDTO.FechaTerminoContratoDesde, consultaContratoDTO.FechaTerminoContratoHasta));
                    }
                    if (consultaContratoDTO.FiltraIngresoCampo)
                    {
                        criteria.Add(Restrictions.Between("FechaIngresoCampo", consultaContratoDTO.FechaIngresoCampoDesde, consultaContratoDTO.FechaIngresoCampoHasta));
                    }
                    if (consultaContratoDTO.FiltraSalidaCampo)
                    {
                        criteria.Add(Restrictions.Between("FechaSalidaCampo", consultaContratoDTO.FechaSalidaCampoDesde, consultaContratoDTO.FechaSalidaCampoHasta));
                    }
                    if (consultaContratoDTO.FiltraLiquidacion)
                    {
                        criteria.Add(Restrictions.Between("FechaLiquidacion", consultaContratoDTO.FechaLiquidacionDesde, consultaContratoDTO.FechaLiquidacionHasta));
                    }
                    criteria.Add(Restrictions.Eq("Estado", Estado.Activo));
                    lista = criteria.List<Contrato>();
                    transaction.Commit();
                }

            }
            return lista;
        }
    }
}